﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Telerik.Web.UI;
using System.Collections;
using Proxy;
using System.Web.Services;
using System.Text;
using System.IO;
using System.Configuration;
using OpenXMLExcel.SLExcelUtility;
using SIM.Util;

namespace SIM.Geo.UI.Geo
{
    public partial class frmImportarSondaje : PageBase
    {
        private List<SondajeImportacion> listaSondajes = new List<SondajeImportacion>();

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                this.rgLista.ClientSettings.Scrolling.ScrollHeight = int.Parse(System.Configuration.ConfigurationManager.AppSettings["listaPrincipalScrollHeight"]);
                CargarCombosImportar();
                OcultarMensaje();

                this.rgLista.DataSource = listaSondajes;
                this.rgLista.DataBind();
                this.ibtnGuardar.Visible = false;
            }

            if (this.hidCodigoLabor.Value.CompareTo(this.hidDato.Value) != 0)
            {
                this.hidCodigoLabor.Value = this.hidDato.Value;
                CargarLabor();
            }
        }

        private void CargarLabor()
        {
            try
            {
                this.searchBoxLabor.Text = string.Empty;
                this.lblLabor.Text = string.Empty;
                using (SELaborClient proxyLabor = new SELaborClient("BasicHttpBinding_ISELabor"))
                {
                    var labor = proxyLabor.Obtener(int.Parse(this.hidCodigoLabor.Value.ToString()));
                    if (labor != null)
                    {
                        this.hidCodigoLabor.Value = labor.CodigoLabor.ToString();
                        this.hidDato.Value = labor.CodigoLabor.ToString();
                        this.lblLabor.Text = labor.NombreLabor + " - " + labor.Cuadrante.ToString();
                        this.searchBoxLabor.Text = labor.NombreLabor;
                    }
                }
            }
            catch (Exception ex)
            {

                Logger.Error("frmImportarSondaje:CargarLabor", ex);
            }
        }

        private void CargarCombosImportar()
        {
            try
            {
                using (SEZonaClient proxy = new SEZonaClient("BasicHttpBinding_ISEZona"))
                {
                    this.Bind(this.ddlZona1, proxy.ObtenerListItem().ToList());
                    this.ddlZona1.Items.Insert(0, new ListItem(Constantes.TipoSeleccion.SELECCIONE, TipoDropDownList.Seleccionar.GetHashCode().ToString()));

                }

                using (SECategoriaSondajeClient proxy = new SECategoriaSondajeClient("BasicHttpBinding_ISECategoriaSondaje"))
                {

                    //Llena los combos para importar

                    this.Bind(this.ddlCategoria, proxy.ObtenerListItem1(enmClaseSondaje.TLG.GetHashCode()).ToList());
                    this.ddlCategoria.Items.Insert(0, new ListItem(Constantes.TipoSeleccion.SELECCIONE, TipoDropDownList.Seleccionar.GetHashCode().ToString()));

                }



                using (SEGeologoClient proxy = new SEGeologoClient("BasicHttpBinding_ISEGeologo"))
                {

                    //Llena los combos para importar
                    this.Bind(this.ddlResponsable, proxy.ObtenerListItem().ToList());
                    this.ddlResponsable.Items.Insert(0, new ListItem(Constantes.TipoSeleccion.SELECCIONE, TipoDropDownList.Seleccionar.GetHashCode().ToString()));
                }

                using (SEEmpresaContratistaClient proxy = new SEEmpresaContratistaClient("BasicHttpBinding_ISEEmpresaContratista"))
                {
                    this.Bind(this.ddlEmpresa, proxy.ObtenerListItem().ToList());
                    this.ddlEmpresa.Items.Insert(0, new ListItem(Constantes.TipoSeleccion.SELECCIONE, TipoDropDownList.Seleccionar.GetHashCode().ToString()));

                }


            }
            catch (Exception ex)
            {

                Logger.Error("frmImportarSondaje.aspx:CargarCombos", ex);
            }
        }


        #region Mensajes


        protected override void MostrarMensaje(string mensaje, enmTipoMensajeMostrar tipoMensaje = enmTipoMensajeMostrar.Informativa)
        {
            this.pnlMensaje.Visible = true;
            this.lblMensaje.Text = mensaje;
            this.pnlMensaje.CssClass = this.ObtenerEstiloMensaje(tipoMensaje);
        }

        protected override void OcultarMensaje()
        {
            this.pnlMensaje.Visible = false;
            this.lblMensaje.Text = string.Empty;
        }

        #endregion

        protected void ddlEmpresa_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                using (SEMaquinaClient proxy = new SEMaquinaClient("BasicHttpBinding_ISEMaquina"))
                {
                    this.Bind(this.ddlMaquina, proxy.ObtenerListItem2(int.Parse(this.ddlEmpresa.SelectedValue), enmDiamantino.NoDiamantino.GetHashCode()).ToList());
                    this.ddlMaquina.Items.Insert(0, new ListItem(Constantes.TipoSeleccion.SELECCIONE, TipoDropDownList.Seleccionar.GetHashCode().ToString()));
                }
            }
            catch (Exception ex)
            {

                Logger.Error("frmImportarSondaje.aspx:ddlEmpresa_SelectedIndexChanged", ex);
            }
        }

        protected void searchBoxLabor_Search(object sender, SearchBoxEventArgs e)
        {
            try
            {
                this.hidDato.Value = "0";
                this.hidCodigoLabor.Value = "0";
                this.searchBoxLabor.Text = string.Empty;
                this.lblLabor.Text = string.Empty;
                if (e.Value != null)
                {
                    this.hidDato.Value = e.Value;
                    this.hidCodigoLabor.Value = e.Value;
                    CargarLabor();
                }
            }
            catch (Exception ex)
            {

                Logger.Error("Sondaje:searchBoxLabor_Search", ex);
            }
        }

        [WebMethod]
        public static List<SearchBoxData> GetResults(SearchBoxContext context)
        {
            List<SearchBoxData> data = null;
            try
            {
                using (SELaborClient proxy = new SELaborClient("BasicHttpBinding_ISELabor"))
                {
                    var lista = proxy.Buscar(context.Text).ToList();
                    data = lista.Select(x => new SearchBoxData { Value = x.CodigoLabor.ToString(), Text = x.NombreLabor }).ToList();
                }


            }
            catch (Exception ex)
            {

                Logger.Error("frmImportarSondaje:GetResults", ex);
            }
            return data;
        }


        /// <summary>
        /// Metodo que importa archivo de Excel
        /// </summary>
        private void ImportarArchivo()
        {


            #region Importacion

            OcultarMensaje();
            if (fuImportar.HasFile)
            {
                FileInfo fiMuestra = new FileInfo(fuImportar.FileName);

                string root = Server.MapPath(ConfigurationManager.AppSettings["rutaArchivosLeyes"]) + fuImportar.FileName;
                if (File.Exists(root))
                    File.Delete(root);
                try
                {

                    fuImportar.SaveAs(root);
                    SLExcelReader excel = new SLExcelReader();
                    this.listaSondajes = excel.ImportarTaladro(root);
                    excel = null;

                    //Validación
                    using (SESondajeClient proxy = new SESondajeClient("BasicHttpBinding_ISESondaje"))
                    {
                        listaSondajes = proxy.ValidarTaladrosImportacion(this.listaSondajes.ToArray()).ToList();
                    }

                    var inconsistentes = listaSondajes.Where(x => x.Validacion.CompareTo("Correcto") != 0).ToList();
                    if (inconsistentes.Count > 0)
                    {
                        MostrarMensaje("Se han encontrado información inconsistente en la importación.", enmTipoMensajeMostrar.Error);
                        this.ibtnGuardar.Visible = false;
                        this.txtObservacion.Text = string.Empty;
                        this.txtObservacion.Enabled = false;
                    }
                    else
                    {
                        this.ibtnGuardar.Visible = true;
                        this.txtObservacion.Enabled = true;
                    }

                    this.rgLista.DataSource = listaSondajes;
                    this.rgLista.DataBind();

                    if (System.IO.File.Exists(root))
                        System.IO.File.Delete(root);
                }
                catch (Exception ex)
                {
                    MostrarMensaje(MSG_ERROR_GENERICO, enmTipoMensajeMostrar.Error);
                    Logger.Error("frmImportarSondaje.aspx:ImportarExterno", ex);
                }
            }
            else
            {
                MostrarMensaje("Seleccione un archivo para la carga.", enmTipoMensajeMostrar.Error);
            }
            #endregion



        }

        protected void ibtnMostrarArchivo_Click(object sender, ImageClickEventArgs e)
        {
            ImportarArchivo();
        }

        protected override void Guardar()
        {
            try
            {
                if (this.rgLista.Items.Count == 0)
                {
                    MostrarMensaje("No ha cargado archivo de taladros.", enmTipoMensajeMostrar.Error);
                    return;
                }
                if (_auditoria.Usuario.CodigoTomadorMuestra == 0)
                {
                    MostrarMensaje("No se puede grabar. El usuario logueado no tiene tiene Tomador de Muestra configurado.", enmTipoMensajeMostrar.Error);
                    return;
                }

                //Recupero los datos de la Grilla
                List<SondajeImportacion> listaSondajes = new List<SondajeImportacion>();
                SondajeImportacion sondaje = null;
                foreach (GridDataItem item in this.rgLista.Items)
                {
                    sondaje = new SondajeImportacion();

                    //TLG,Seccion,Aux,Fila,Este,Norte,Cota,Azimut,Inclinacion,Distancia,Fecha,CodigoMuestra,Desde,Hasta
                    sondaje.TLG = item.GetDataKeyValue("TLG").ToString();
                    sondaje.Seccion = double.Parse(item.GetDataKeyValue("Seccion").ToString());
                    sondaje.Aux = item.GetDataKeyValue("Aux").ToString();
                    sondaje.Fila = int.Parse(item.GetDataKeyValue("Fila").ToString());
                    sondaje.Este = double.Parse(item.GetDataKeyValue("Este").ToString());
                    sondaje.Norte = double.Parse(item.GetDataKeyValue("Norte").ToString());
                    sondaje.Cota = double.Parse(item.GetDataKeyValue("Cota").ToString());
                    sondaje.Azimut = double.Parse(item.GetDataKeyValue("Azimut").ToString());
                    sondaje.Inclinacion = double.Parse(item.GetDataKeyValue("Inclinacion").ToString());
                    sondaje.Distancia = double.Parse(item.GetDataKeyValue("Distancia").ToString());
                    sondaje.Fecha = DateTime.Parse(item.GetDataKeyValue("Fecha").ToString());
                    sondaje.CodigoMuestra = item.GetDataKeyValue("CodigoMuestra").ToString();
                    sondaje.Desde = double.Parse(item.GetDataKeyValue("Desde").ToString());
                    sondaje.Hasta = double.Parse(item.GetDataKeyValue("Hasta").ToString());
                    sondaje.Validacion = item.GetDataKeyValue("Validacion").ToString();
                    sondaje.Observacion = this.txtObservacion.Text.Trim();


                    //Completo campos de sondaje
                    sondaje.CodigoCategoriaSondaje = int.Parse(this.ddlCategoria.SelectedValue);
                    sondaje.CodigoGeologo = int.Parse(this.ddlResponsable.SelectedValue);
                    if (this.hidCodigoLabor.Value.CompareTo("0") != 0)
                    {
                        sondaje.CodigoLabor = int.Parse(this.hidCodigoLabor.Value);
                    }
                    else
                    {
                        sondaje.CodigoLabor = null;
                    }

                    sondaje.NumeroSondaje = "000";
                    sondaje.CodigoZona = int.Parse(this.ddlZona1.SelectedValue);
                    sondaje.CodigoEmpresa = int.Parse(this.ddlEmpresa.SelectedValue);
                    sondaje.CodigoMaquina = int.Parse(this.ddlMaquina.SelectedValue);
                    sondaje.CodigoClaseSondaje = enmClaseSondaje.TLG.GetHashCode();
                    sondaje.Estado = (short)enmEstadoSondaje.Iniciado.GetHashCode();
                    sondaje.Anio = sondaje.Fecha.Year;

                    listaSondajes.Add(sondaje);
                }

                var validacion = listaSondajes.Where(x => x.Validacion.CompareTo("Correcto") != 0).ToList();
                if (validacion.Count > 0)
                {
                    MostrarMensaje("No se puede grabar. Existen incostencias", enmTipoMensajeMostrar.Error);
                    return;
                }

                #region Preparar para grabar

                //Preparo la lista para Grabar
                List<string> taladros = listaSondajes.Select(x => x.TLG).Distinct().ToList();
                List<Sondaje> listaSondajesGrabar = new List<Sondaje>();
                Sondaje sondajeGrabar = null;
                foreach (var codigoTaladro in taladros)
                {
                    var taladro = listaSondajes.Where(x => x.TLG.CompareTo(codigoTaladro) == 0).FirstOrDefault();
                    if (taladro != null)
                    {
                        sondajeGrabar = new Sondaje();

                        sondajeGrabar.CodigoSondaje = 0;
                        sondajeGrabar.NombreDDH = taladro.TLG;
                        sondajeGrabar.NumeroSondaje = taladro.NumeroSondaje;
                        sondajeGrabar.FechaInicio = taladro.Fecha;
                        sondajeGrabar.FechaFin = null;
                        sondajeGrabar.Seccion = (int)taladro.Seccion;
                        sondajeGrabar.CumpleLitologia = 0;
                        sondajeGrabar.CumpleMuestra = 1;
                        sondajeGrabar.CumpleGeomecanica = 0;
                        sondajeGrabar.CumpleEstructura = 0;
                        sondajeGrabar.Observacion = taladro.Observacion;
                        sondajeGrabar.Norte = taladro.Norte;
                        sondajeGrabar.Este = taladro.Este;
                        sondajeGrabar.Cota = taladro.Cota;
                        sondajeGrabar.Distancia = taladro.Distancia;
                        sondajeGrabar.Azimut = taladro.Azimut;
                        sondajeGrabar.Inclinacion = taladro.Azimut;
                        sondajeGrabar.Estado = taladro.Estado; //Iniciado
                        sondajeGrabar.CodigoMaquina = taladro.CodigoMaquina;  //Maquina
                        sondajeGrabar.CodigoLabor = taladro.CodigoLabor; //Codigo de Labor

                        sondajeGrabar.CodigoGeologo = taladro.CodigoGeologo; //Codigo de Geologo
                        sondajeGrabar.Anio = taladro.Anio; // Año
                        sondajeGrabar.Fila = taladro.Fila;
                        sondajeGrabar.AuxiliarSeccion = taladro.Aux;
                        sondajeGrabar.CodigoZona = taladro.CodigoZona; // Codigo de Zona
                        sondajeGrabar.CodigoCategoriaSondaje = taladro.CodigoCategoriaSondaje; // CategoriaSondaje
                        sondajeGrabar.NumeroSondaje = taladro.NumeroSondaje;
                        sondajeGrabar.CodigoClaseSondaje = taladro.CodigoClaseSondaje; // Clase Sondaje
                        sondajeGrabar.CodigoEmpresa = taladro.CodigoEmpresa; // Codigo de Empresa
                        sondajeGrabar.CumplioLitologia = 0;
                        sondajeGrabar.CumplioMuestra = 0;
                        sondajeGrabar.CumplioGeomecanica = 0;
                        sondajeGrabar.CumplioEstructura = 0;

                        var muestras = listaSondajes.Where(x => x.TLG.CompareTo(codigoTaladro) == 0).ToList();
                        MuestraSondaje muestra = null;
                        List<MuestraSondaje> listaMuestra = null;
                        foreach (var imuestra in muestras)
                        {
                            if (listaMuestra == null) listaMuestra = new List<MuestraSondaje>();

                            muestra = new MuestraSondaje();

                            muestra.CodigoMuestraSondaje = imuestra.CodigoMuestra;
                            muestra.Desde = (double)imuestra.Desde;
                            muestra.Hasta = (double)imuestra.Hasta;
                            muestra.ValorAg = -1;
                            muestra.ValorPb = -1;
                            muestra.ValorZn = -1;
                            muestra.ValorCu = -1;
                            muestra.ValorFe = -1;
                            muestra.Observacion = imuestra.Observacion;
                            muestra.Estado = enmEstadoMuestraSondaje.Registrado.GetHashCode(); //Registrado
                            muestra.CodigoMuestraSondajeDuplicado = null;
                            muestra.CodigoTipoControlCalidad = enmTipoCalidad.Comun.GetHashCode();
                            muestra.CodigoTomadorMuestra = _auditoria.Usuario.CodigoTomadorMuestra;
                            muestra.FechaEnvio = imuestra.Fecha;
                            muestra.CodigoGeologo = imuestra.CodigoGeologo;

                            listaMuestra.Add(muestra);
                        }
                        sondajeGrabar.MuestraSondaje = listaMuestra.ToArray(); //Asigno las muestras
                        listaSondajesGrabar.Add(sondajeGrabar);
                    }
                }
                #endregion

                using (SESondajeClient proxy = new SESondajeClient("BasicHttpBinding_ISESondaje"))
                {
                    proxy.ImportarSondajeYMuestra1(listaSondajesGrabar.ToArray());
                }

                MostrarMensaje("Proceso de Importación se realizó existosamente.");
                this.ibtnGuardar.Visible = false;
                Response.Redirect("frmTaladroLargo.aspx", false);
            }
            catch (Exception ex)
            {
                MostrarMensaje(MSG_ERROR_GENERICO, enmTipoMensajeMostrar.Error);
                Logger.Error("frmImportarSondaje.aspx:Guardar", ex);
            }


        }

        protected void ibtnGuardar_Click(object sender, ImageClickEventArgs e)
        {
            Guardar();
        }

        protected void ibtnCancelar_Click(object sender, ImageClickEventArgs e)
        {
            Response.Redirect("frmTaladroLargo.aspx", false);
        }
    }
}